---
title: Local Cluster Demo
---

# Local Cluster Demo

This guide will walk you through setting up a local 3-node Marmot cluster and testing replication capabilities.

## Prerequisites

- **Marmot Binary**: Ensure you have the `marmot-v2` binary built and available.
- **MySQL Client**: `mysql` CLI or any GUI client (DBeaver, etc.).
- **Terminal**: A terminal with bash/zsh.

## Step 1: Start the Cluster

We will start 3 nodes on your local machine.

### Node 1 (Seed Node)
Open a new terminal tab/window and run:

```bash
# Node 1: HTTP 8081, MySQL 3307
./marmot-v2 -config cfg/config.toml -cluster-addr :8081 -mysql-port 3307 -node-id 1
```

### Node 2
Open a second terminal tab/window and join the cluster:

```bash
# Node 2: HTTP 8082, MySQL 3308
./marmot-v2 -config cfg/config.toml -cluster-addr :8082 -mysql-port 3308 -node-id 2 -seeds localhost:8081
```

### Node 3
Open a third terminal tab/window and join the cluster:

```bash
# Node 3: HTTP 8083, MySQL 3309
./marmot-v2 -config cfg/config.toml -cluster-addr :8083 -mysql-port 3309 -node-id 3 -seeds localhost:8081
```

> **Note**: You should see logs indicating that nodes have joined the cluster and established connections.

## Step 2: Test Replication

Now let's verify that data replicates across the cluster.

### Connect to Node 1
Open a fourth terminal tab/window:

```bash
mysql -h 127.0.0.1 -P 3307 -u root
```

Run the following SQL:

```sql
-- Create a database and table
CREATE DATABASE demo;
USE demo;
CREATE TABLE users (id INT PRIMARY KEY, name VARCHAR(50));

-- Insert some data
INSERT INTO users VALUES (1, 'Alice'), (2, 'Bob');
```

### Connect to Node 2
In a new terminal tab (or exit the previous mysql session):

```bash
mysql -h 127.0.0.1 -P 3308 -u root
```

Verify data replication:

```sql
USE demo;
SELECT * FROM users;
-- Should show Alice and Bob
```

Make changes on Node 2:

```sql
-- Update a record
UPDATE users SET name = 'Bobby' WHERE id = 2;

-- Insert a new record
INSERT INTO users VALUES (3, 'Charlie');
```

### Connect to Node 3
Check Node 3:

```bash
mysql -h 127.0.0.1 -P 3309 -u root
```

Verify all changes:

```sql
USE demo;
SELECT * FROM users;
-- Should show:
-- 1 | Alice
-- 2 | Bobby
-- 3 | Charlie
```

## Step 3: Test Fault Tolerance

Let's simulate a node failure.

1. **Kill Node 2**: Go to the terminal running Node 2 and press `Ctrl+C`.
2. **Write to Node 1**:
   ```sql
   INSERT INTO users VALUES (4, 'Dave');
   ```
3. **Restart Node 2**: Run the same command to start Node 2 again.
4. **Verify Recovery**: Connect to Node 2 and check if it caught up.
   ```sql
   SELECT * FROM users WHERE id = 4;
   -- Should show Dave
   ```

Marmot's anti-entropy mechanism ensures that Node 2 automatically fetches missing data from peers upon rejoining.

## Cleanup

To stop all nodes, simply `Ctrl+C` in each terminal window. To clean up the data directories:

```bash
rm -rf ./marmot-data*
```
